package com.aididi.collection;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;

/**
 * @Auther: zx.xu
 * @Description:    list去重
 */
public class ListDemo {
    //方案一:借助Set的特性进行去重
    /**
     * 去除重复数据
     * 由于Set的无序性，不会保持原来顺序
     * @param list
     */
    public static List<String> distinct1(List<String> list) {
        final boolean sta = null != list && list.size() > 0;
        List doubleList= new ArrayList();
        if (sta) {
            Set set = new HashSet();
            set.addAll(list);
            doubleList.addAll(set);
        }
        return doubleList;
    }

    //方案二 :利用set集合特性保持顺序一致去重
    //Set去重并保持原先顺序的两种方法
    public static void delRepeat1(List<String> list) {
        //方法一
        List<String> listNew = new ArrayList<String>(new TreeSet<String>(list));
        //方法二
        List<String> listNew2 = new ArrayList<String>(new LinkedHashSet<String>(list));
    }

    //使用list自身方法remove()–>不推荐
    /**
     * 去除重复数据(一般不推荐)
     * 类似于冒泡排序思想
     * @param list
     */
    public static List<Map<String, Object>> distinct2(List<Map<String, Object>> list) {
        if (null != list && list.size() > 0) {
            //循环list集合
            for  ( int  i  =   0 ; i  <  list.size()  -   1 ; i ++ )  {
                for  ( int  j  =  list.size()  -   1 ; j  >  i; j -- )  {
                    // 这里是对象的比较，如果去重条件不一样，在这里修改即可
                    if  (list.get(j).equals(list.get(i)))  {
                        list.remove(j);
                    }
                }
            }
        }
        //得到最新移除重复元素的list
        return list;
    }

    //遍历List集合,将元素添加到另一个List集合中
// 遍历后判断赋给另一个list集合，保持原来顺序
    public static List<String> delRepeat2(List<String> list) {
        List<String> listNew = new ArrayList<String>();
        for (String str : list) {
            if (!listNew.contains(str)) {
                listNew.add(str);
            }
        }
        return listNew ;
    }

    //方案5 : 使用Java8特性去重
    public static List<String> delRepeat3(List<String> list) {
        List<String> myList = list.stream().distinct().collect(Collectors.toList());
        return myList ;
    }


    public static void main(String[] args) {
        List<String> listNew = new ArrayList<String>(5);
        listNew.add("x");
        String oldVal = listNew.set(0,"cd");

        //测试扩容次数代码：
        int oldCapacity = 10;
        int newCapacity = 0;
        int growCount=0;

        while(newCapacity < 1000){
            newCapacity = oldCapacity + oldCapacity / 2;
            oldCapacity = newCapacity;
            growCount++;
        }
        System.out.println("容量达到1000需要扩容次数："+growCount);



    }

}
